FORTH(3X) FORTH(3X) NAME forth forth-83 standard word set and tile forth kernel extensions SYNOPSIS forth DESCRIPTION The required word set of Forth-83 Standard excluding the block file word set and the tile forth kernel extensions. Each "word" (function, procedure, variable, etc) is described with its stack action, parameters, and return values and its code type. The format of the glossary list is: ( ) [ ] The describes the parameter and return values for the word in the following format: ( -- ) The arguments and return values are given from left to right with the deepest stack value first. Symbolic names are often used for the arguments while the return values are often only described by data type. The optional may define how the word is interpreted and when it is visible. The mode "immediate" marks the word as always executed. The mode "execution" reduces the words visibility to only execution, i.e., interpretation, mode. The mode "compilation" reduces the words visibility to only compilation mode. Last, the mode "private" marks the words as only visible in the vocabulary where it is defined. Additional modes are added by other tile forth extensions. The list of required words in the Forth-83 Standard are described in the following sub-sections; "Stack Manipulation", "Memory Access", "Logic", "Arithmetic", "Comparison", "Numeric Conversion", "Control Structures", "Terminal Input/Output", "Interpreter", "Vocabulary", and "Defining Words". Each sub-section is sorted in ASCII order. Stack Manipulation The Forth-83 Standard parameter and return stack manipulation functions. The tile forth kernel also supports the double number stack manipulation extension. code -rot ( x y z -- z x y) The top three stack entries are rotated, forcing the top to become the deepest of the three. code 2>r ( x y -- ) compilation Double "to-r". "x" and "y" are transferred to the return stack. September 17, 1990 1 FORTH(3X) FORTH(3X) code 2drop ( x y -- ) Double "drop". "x" and "y" are dropped. code 2dup ( x1 y1 -- x1 y1 x1 y1) Double "dup". The first pair is copied. code 2over (x1 y1 x2 y2 -- x1 y1 x2 y2 x1 y1) Double "over". The second pair is copied. code 2r> ( -- x y) compilation Double "from-r". "x" and "y" are removed from the return stack and transferred to the data stack. code 2rot ( x1 y1 x2 y2 x3 y3 -- x2 y2 x3 y3 x1 y1) Double "rot". The three pairs change places. code 2swap ( x1 y1 x2 y2 -- x2 y2 x1 y1) Double "swap". The two pairs change places. code >r ( x -- ) compilation Transfer "x" to the return stack. code ?dup ( x -- [x x] or [x]) Duplicate "x" if it is non-zero. code depth ( -- +n) "+n" is the number of values contained in the data stack before "+n" was placed on the stack. code drop ( x -- ) "x" is removed from the stack. code dup ( x -- x x) Duplicate "x". code nip ( x y -- y) The second stack element "x" is removed. code over ( x y -- x y x) A copy of "x" is made and moved over "y". code pick ( +n -- x) "x" is a copy of the "+n"-th stack element, not counting "+n" itself. [0..depth-1] "0 pick" is equivalent to "dup" "1 pick" is equivalent to "over" code r> ( -- x) compilation "x" is removed from the return stack and transferred to the data stack. code r@ ( -- x) compilation "x" is a copy of the top of the return stack. September 17, 1990 2 FORTH(3X) FORTH(3X) code roll ( +n -- ) The "+n"-th stack value, not counting "+n" itself is first removed and then transferred to the top of the stack, moving the remaining values into the vacated position. The parameter should be in the interval: [0..depth-1]. "0 roll" is a null operation "1 roll" is equivalent to "swap" "2 roll" is equivalent to "rot" code rot ( x y z -- y z x) The top three stack entries are rotated, bringing the deepest to the top. code swap ( x y -- y x) The top two stack entries are exchanged. code tuck ( x y -- y x y) A copy of "y" is tucked under "x". Memory Access The Forth-83 Standard memory and data access word set. The tile forth kernel extends the Forth-83 Standard with additional access functions for bit testing and bit field access. All access to memory is achieved through this word set. code ! ( 32b addr -- ) The postfix assignment operator. Store "32b" at "addr". code +! ( x1 addr -- ) "x1" is added to the value at "addr" using the convention for "+". The value at "addr" is assumed to be of size "cell". The sum replaces the original value at "addr". code -match ( addr1 addr2 n -- bool) Matches the strings at address "addr1" and "addr2" of length "n" at the parameter addresses. Returns "false" if the strings are equal else "true". If the length "n" is zero the function will return "true". code -trailing ( addr +n1 -- addr +n2) The character counter "+n1" of a text string beginning at "addr" is adjusted to exclude trailing spaces. If "+n1" is zero, then "+n2" is zero. If the entire string consists of spaces, then "+n2" is zero. code ( addr1 addr2 u -- ) Move the "u" bytes at address "addr1" to "addr2". The move begins by moving the byte at ("addr1"+"u"-1) to ("addr2"+"u"-1) and proceeds to successively lower addresses for "u" bytes. If "u" is zero nothing is moved. Useful for sliding a string towards higher addresses. September 17, 1990 4 FORTH(3X) FORTH(3X) code count ( addr1 -- addr2 +n) "addr2" is "addr1"+1 and "+n" is the length of the counted string at "addr1". The byte "addr1" contains the byte count "+n". Range of "+n" is [0..255]. code f! ( x y p w -- z) Inserts the value of "x" into "y" at the bit field which is defined by the position "p" and with the width "w". The value "x" is shifted and masked into "y" to form the result "z". code f@ ( x p w -- y) Field access within a 32-bit quantity. "y" are the bits within "x" at position "p" and with a bit field width, "w". Bits positions are counted from right to left starting with zero. A field is defined from a position and upwards. code fill ( addr u 8b -- ) "u" bytes of memory beginning at "addr" are set to "8b". No action is taken is "u" is zero. code w! ( 16b addr -- ) The postfix assignment operator. Store "16b" at "addr". code w@ ( addr -- 16b) "16b" is the value at "addr". The value is not sign extended. Logic The Forth-83 Standard logic functions. The tile forth kernel extends the basic function set with boolean constants and a boolean conversion function. All logic functions manipulate their parameters bit-by-bit. code and ( 32b1 32b2 -- 32b3) "32b3" is the bit-by-bit logical and of "32b1" and "32b2". code boolean ( n -- bool) Maps numerical value to a boolean value, "true" or "false". Non-zero values are mapped to "true" and zero to "false". constant false ( -- 0) The constant "false" represented by the value zero. code or ( 32b1 32b2 -- 32b3) "32b3" is the bit-by-bit inclusive-or of "32b1" with "32b2". September 17, 1990 5 FORTH(3X) FORTH(3X) code not ( 32b1 -- 32b2) "32b2" is the one's complements of "32b1". constant true ( -- -1) The constant "true" represented by the value minus one. code xor ( 32b1 32b2 -- 32b3) "32b3" is the bit-by-bit exclusive-or of "32b1" with "32b2". Arithmetic The Forth-83 Standard arithmetic word set. The tile forth kernel extends the Forth-83 Standard with arithmetic functions for shifting and additional numeric constants. Double number width arithmetic function such as "d+" and "dnegate" are not implemented as tile forth is a 32-bit implementation. Arithmetic errors are caught by the tile forth kernel and passed to the application as signals. An exception block may be used to catch the signal. code * ( w1 w2 -- w3) "w3" is the least-significant 32 bits of the arithmetic product of "w1" times and "w2". code */ ( w1 w2 w3 -- w4) "w1" is first multiplied by "w2" producing an intermediate 32-bit result. "w4" is the floor of the quotient of the intermediate 32-bit result divided by the divisor "w3". The product of "w1" times "w2" is maintained as an intermediate 32-bit result for greater precision then the otherwise equivalent sequence: "w1 w2 * w3 /". An error condition results if the divisor is zero and an exception is raised. code */mod ( w1 w2 w3 -- w4 w5) "w1" is first multiplied by "w2" producing an intermediate 32-bit result. "w4" is the remainder and "w5" is the floor of the quotient of the intermediate 32-bit result divided by the divisor "w3". A 32-bit intermediate product is used as for "*/". "w4" has the same sign as "w3" or is zero. An error condition results if the divisor is zero and an exception is raised. code + ( w1 w2 -- w3) "w3" is the arithmetic sum of "w1" and "w2". code - ( w1 w2 -- w3) "w3" is the result of subtracting "w2" from "w1". constant -1 ( -- -1) Constant minus one. September 17, 1990 6 FORTH(3X) FORTH(3X) constant -2 ( -- -2) Constant minus two. constant -4 ( -- -4) Constant minus four. code / ( w1 w2 -- w3) "w3" is the floor of the quotient of "w1" divided by the divisor "w2". An error condition results if the divisor is zero. code /mod ( w1 w2 -- w3 w4) "w3" is the remainder and "w4" the floor of the quotient of "w1" divided by the divisor "w2". "w3" has the same sign as "w2" or is zero. An error condition results if the divisor is zero and an exception is raised. constant 0 ( -- 0) Constant zero. constant 1 ( -- 1) Constant one. code 1+ ( w1 -- w2) "w2" is the result of adding one to "w1" according to the operation of "+". code 1- ( w1 -- w2) "w2" is the result of subtracting one to "w1" according to the operation of "-". constant 2 ( -- 2) Constant two. code 2* ( n1 -- n2) "n2" is the result of arithmetically shifting "n1" left one bit. The sign is included in the shift and remains unchanged. code 2+ ( w1 -- w2) "w2" is the result of adding two to "w1" according to the operation of "+". code 2- ( w1 -- w2) "w2" is the result of subtracting two to "w1" according to the operation of "-". code 2/ ( n1 -- n2) "n2" is the result of arithmetically shifting "n1" right one bit. The sign is included in the shift and remains unchanged. September 17, 1990 7 FORTH(3X) FORTH(3X) constant 4 ( -- 4) Constant four. code << ( n1 n2 -- n3) "n3" is the result of logically shifting "n1" left "n2" steps. code >> ( n1 n2 -- n3) "n3" is the result of logically shifting "n1" right "n2" steps. code abs ( n -- u) "u" is the absolute value of "n". code max ( n1 n2 -- n3) "n3" is the greater of "n1" and "n2" according to the operation of ">". code min ( n1 n2 -- n3) "n3" is the lesser of "n1" and "n2" according to the operation of "<". code mod ( n1 n2 -- n3) "n3" is the remainder after dividing "n1" by divisor "n2". "n3" has the same sign as "n2" or is zero. An error condition results if the divisor is zero or if the quotient falls outside of the numerical range. code negate ( n1 -- n2) "n2" is the two's complement of "n1", i.e., the difference of zero less "n1". constant nil ( -- 0) Constant for a nil pointer. code um* ( u1 u2 -- u3) "u3" is the unsigned product of "u1" times "u2". All values and arithmetic are unsigned. code um/mod ( u1 u2 -- u3 u4) "u3" is the remainder and "u4" is the floor of the quotient after dividing "u1" by the divisor "u2". All values and arithmetic are unsigned. An error condition results if the divisor is zero or if the quotient lies outside the numerical range. Comparison The Forth-83 Standard comparison word set. The tile forth kernel extends the standard with an integer range test function. The kernel does not implement double number comparison functions. Boolean values "true" and "false" are represented with "-1" and "0". September 17, 1990 8 FORTH(3X) FORTH(3X) code 0< ( n -- bool) Returns "true" if "n" is less than zero (negative). code 0= ( w -- bool) Returns "true" if "w" is zero. code 0> ( n -- bool) Returns "true" if "n" is greater than zero. code < ( n1 n2 -- bool) Returns "true" if "n1" is less than "n2". code = ( w1 w2 -- bool) Returns "true" if "w1" is equal to "w2" code > ( n1 n2 -- bool) Returns "true" if "n1" is greater than "n2" code ?within ( value lower upper -- bool) Tests if the parameter "value" is within the range "lower" to "upper". Returns "true" if within the range else "false". code u< ( u1 u2 -- bool) Returns "true" if "u1" is less than "u2". Numeric Conversion The Forth-83 Standard numeric conversion functions. The tile forth kernel extends the standard with string to number converter, and general number literal recognition. code # ( +d1 -- +d2 ) The remainder of "+d1" divided by the value of "base" is converted to a ASCII character and appended to the output string toward lower memory addresses. "+d2" if the quotient and is maintained for further processing. Typically used between "<#" and "#>". code #> ( x -- addr +n) Pictured numeric output conversion is ended dropping "x". "addr" is the address of the resulting output string. "+n" is the number of characters in the output string. "addr" and "+n" together are suitable for "type". code #s ( +x -- 0) "+x" is converted appending each resultant character into the pictured numeric output string until the quotient is zero. A single zero is appended to the output string if the number was initially zero. Typically used between "<#" and "#>". September 17, 1990 9 FORTH(3X) FORTH(3X) code <# ( x -- ) Initialize pictured numeric output conversion. The words: "<# # #s hold sign #>" can be used to specify the conversion of a number into an ASCII text string stored in right-to-left order. code ?number ( str -- [n true] or [str false]) recognizer Convert a string of character to a number using the current "base". If the conversion is not possible the string is returned with a "false" flag indicating that the conversion failed otherwise the conversion value, the number, and a "true" flag is returned. variable base ( -- addr) The address of a variable containing the current numeric conversion radix. code binary ( -- ) Set the input-output numeric conversion "base" to 2. code convert ( +d1 addr1 -- +d2 addr2) "+d2" is the result of converting the characters within the text beginning at "addr1"+1 into digits, using the value of "base", and accumulating each into "+d1" after multiplying "+d1" by the value of "base". Conversion continues until an inconvertible character is encountered. "addr2" is the location of the first inconvertible character. code decimal ( -- ) Set the input-output numeric conversion "base" to 10. code hex ( -- ) Set the input-output numeric conversion "base" to 16. code hold ( char -- ) "char" is inserted into a pictured numeric output string. Typically used between "<#" and "#>". code octal ( -- ) Set the input-output numeric conversion "base" to 8. code sign ( n -- ) If "n" is negative, an ASCII "-" (minus sign) is appended to the pictured numerical output string. Typically used between "<#" and "#>". Control Structures The Forth-83 Standard control flow word set. The tile September 17, 1990 10 FORTH(3X) FORTH(3X) forth kernel extends the basic set of control structures with environment arguments access, conditional compilation, case structure, additional loop constructs, and recursion words. code #else ( -- ) immediate Used in the following form: #if #else #then Marks the beginning of a "else"-part of a conditional code section. code #if ( flag -- ) immediate Used in the following form: #if [ #else ] #then Marks the beginning of a conditional code section. The else section is optional. code #ifdef ( -- ) immediate Used in the following form for testing if a symbol already is available: #ifdef [ #else ] #then If is available in the current search chain "context" the true section of code is executed or compiled according to mode else the optional false section. code #ifundef ( -- ) immediate Used in the following form: #ifundef [ #else ] #then Performs the same function as "#ifdef" but the true section is executed if the symbol is not available in the current search chain. code #then ( -- ) immediate Used in the following form: #if [ #else ] #then Marks the end of a conditional code section. code +loop ( n -- ) immediate compilation "n" is added to the loop index. If the new index was incremented across the boundary between limit-1 and limit then the loop is terminated and the loop control parameters are discarded. When the loop is not terminated, execution continues to just after the corresponding "do". "+loop" is not available outside a colon definition. code ?do ( w1 w2 -- ) immediate compilation Used in the following forms: ?do ... { i | leave } ... loop or ?do ... { i | leave } ... +loop September 17, 1990 11 FORTH(3X) FORTH(3X) Begins a checked entry loop which terminates based on control parameters. The loop index begins at "w2", and terminates based on the limit "w1". See "loop" and "+loop" for details on how the loop is terminated. If "w1" and "w2" are equal the loop section is skipped. code abort ( -- ) Clears the data stack and performs the function of "quit". No message is displayed. code abort" ( flag -- ) immediate compilation Used in the following form: abort" " When later executed, if "flag" is true the delimited by close quote, is displayed and then a system dependent error abort sequence, including the function "abort", is performed. If "flag" is false, the flag is dropped and execution continues. The blank following abort" is not part of the . code again ( -- ) immediate compilation Used in the following form to compile an eternal loop: begin ... again The loop construct may only be left by an "abort" or an "exit" word in the code section of the loop. code argc ( -- num) Returns the number of arguments passed from the environment. The first argument is always the name of the application: "forth" or the name of the start symbol. code argv ( n -- str) Given an index returns the corresponding argument string. The "string" vocabulary words may be used for process an argument string. code begin ( -- ) immediate compilation Used in the following forms: begin ... while ... repeat or begin ... until grotty:t:temp:11317:fatal error: integer expected or begin ... again "begin" marks the start of a word sequence for repetitive execution. A "begin-while-repeat" loop will repeat until is false. "begin-until" loop will be repeated until is true and "begin-again" will repeat until "abort"-ed. The words after "until" and "repeat" will be executed when either loop is finished. September 17, 1990 12 FORTH(3X) FORTH(3X) code bye ( -- ) Leaves the interaction level and exits to the outer support system (if any). code case ( value -- ) immediate compilation Used in the following form: case { } endcase to mark the beginning of a case structure which should contain a one or several case statements: of endof The code section after the last case value part will receive "value" as a parameter thus a default behavior is easy implemented. The default section may only copy this value as "endcase" is an implicit "drop". code do ( w1 w2 -- ) immediate compilation Used in the following forms: do ... { i | leave } ... loop or do ... { i | leave } ... +loop Begins a loop which terminates based on control parameters. The loop index begins at "w2", and terminates based on the limit "w1". See "loop" and "+loop" for details on how the loop is terminated. The loop is always executed at least once. code else ( -- ) immediate compilation Used in the following form: if else then in a conditional structure to mark the beginning of the false section. This section is executed when the is "false". The true section is then skipped. code endcase ( -- ) immediate compilation Used in the following form: case { } endcase to mark the end of a case structure. code endof ( -- ) immediate compilation Used in the following form: of endof to mark the end of a cast value structure. code execute ( addr -- ) The word definition indicated by "addr" is executed. An error condition exists if "addr" is not a compilation address. code exit ( -- ) compilation Compiled within a colon definition such that when executed, the colon definition returns control to the definition that passed control to it by September 17, 1990 13 FORTH(3X) FORTH(3X) returning control to the return point on the top of the return stack. An error condition exists if the top of the return stack does not contain a valid return point. May not be used within a "do-loop" or "do-+loop" or an "exception"-block. code i ( -- w) compilation "w" is a copy of the current loop index. May only be used in the form: do ... { i | leave } ... loop or do ... { i | leave } ... +loop "i" is not visible outside a colon definition, i.e., when text interpreting and should only be used within a loop-block. code if ( flag -- ) immediate compilation Used in the following form: if [ else ] then If "flag" is true, the words following "if" are executed and the words following "else" until just after "then" are skipped. The "else" part is optional. If "flag" is false, words from "if" through "else", or from "if" through "then" (when no "else" is used) are skipped. code j ( -- w) compilation "w" is a copy of the index of the next outer loop. May only be used within a nested "do-loop" or "do-+loop" in the form: do ... do ... { i | j | leave } ... loop ... loop "j" is not visible outside a colon definition, i.e., when text interpreting. code leave ( -- ) compilation Transfers execution to just beyond the next "loop" or "+loop". The loop is terminated and the loop control parameters are discarded. May only be used in the following forms: do ... { i | leave } ... loop or do ... { i | leave } ... +loop "leave" may appear within other control structures which are nested within the "do-loop" structure. More than one "leave" may appear within a do-loop. code loop ( -- ) immediate compilation Increments the "do-loop" index by one. If the new index was incremented across the boundary between limit-1 and limit the loop is terminated and the loop control parameters are discarded. When the loop is not terminated, execution continues to just after the corresponding "do". September 17, 1990 14 FORTH(3X) FORTH(3X) code of ( value -- ) immediate compilation Used in the following form: of endof within a case structure to define a value case. code quit ( -- ) Clears the return stack, sets interpret state, accepts new input from the current input device, and begins text interpretation. No messages is displayed. code recurse ( -- ) immediate compilation Used within a definition to make a recursive call to the current definition. code repeat ( -- ) immediate compilation Used in the following form: begin ... while ... repeat At execution-time, "repeat" continues execution to just after the corresponding "begin". code tail-recurse ( -- ) immediate compilation Used within a definition to create a recursive call to the current definition without saving return status. This is an efficient way of generating iterative forms as tail recursive calls may be performed any number of times within a definition and corresponds to a branch to the beginning of the definition. code then ( -- ) immediate compilation Used in the following form: if [ else ] then Marks the end of a conditional statement "if-else- then". code until ( flag -- ) immediate compilation Used in the following form: begin ... until Marks the end of a "begin-until" loop which will terminate based on "flag". If "flag" is true, the loop is terminated. If "flag" is false, execution continues to just after the corresponding "begin". code while ( flag -- ) immediate compilation Used in the following form: begin ... while ... repeat Selects conditional execution based on "flag". When "flag" is true, execution continues to just after the "while" through to the "repeat" which then continues execution to just after the "begin". When "flag" is false, execution continues to just after the "repeat", exiting the control structure. September 17, 1990 15 FORTH(3X) FORTH(3X) Terminal Input/Output The Forth-83 Standard terminal interaction functions. The tile forth kernel extends the basic set of input and output functions with field format output and access of the current input source file name and the current line number count. code . ( n -- ) The absolute value of "n" is displayed in a free field format with a leading minus sign if "n" is negative. A space is emit after the number. code ." ( -- ) immediate compilation Used in the following form within a code definition: " Later execution will display the characters up to but but including the delimiter (close-quote). The blank following the "." " is not part of the but the word separator. code .( ( -- ) immediate Used in the following form: .( ) The characters up to but not including the delimiter (closing-parenthesis) are displayed. The blank following ".(" is not part of the . code .s ( -- ) Displays the current parameter stack contents in the format: [ ] \ ... \ code ascii ( -- char) immediate Used in the following form: ascii ( -- char) to create a character literal. code cr ( -- ) Emits ASCII characters carriage-return and line- feed. code emit ( x -- ) The least-significant 7-bit ASCII character is displayed. code expect ( addr +n -- ) Receive characters and store each into memory.